home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
THINKC
/
4_0
/
MARQUEE_
/
MARQUEE.C
< prev
next >
Wrap
Text File
|
1990-07-16
|
3KB
|
113 lines
/* marquee.c */
#include "marquee.h"
typedef struct MarqueeRec {
struct MarqueeRec *fNext;
int fType;
Rect fFromRect, fToRect;
BitMap fBits;
int fOffset;
int fLeftMaximum;
long fDelayTimer;
WindowPtr fMarqueePort;
} MarqueeRec,*MarqueePtr;
QHdr gMarqueeQueue;
BitMap StringToBitMap (Str255 s, int h, int v, int descent);
/***************************/
BitMap StringToBitMap (Str255 s, int h, int v, int descent)
{
GrafPtr saved;
GrafPort newPort;
Rect r;
GetPort(&saved);
OpenPort(&newPort);
SetRect(&r,0,0,h,v);
BlockMove( &r, &newPort.portRect, sizeof(Rect));
RectRgn(newPort.visRgn, &r);
RectRgn(newPort.clipRgn, &r);
newPort.portBits.rowBytes = ((h + 15) / 16) * 2;
newPort.portBits.baseAddr = NewPtr( v * newPort.portBits.rowBytes );
BlockMove(&r,&newPort.portBits.bounds, sizeof(Rect));
EraseRect(&r);
MoveTo(0, v - descent);
TextFont(saved->txFont);
TextFace(saved->txFace);
TextSize(saved->txSize);
DrawString(s);
SetPort(saved);
return newPort.portBits;
}
/***************************/
void MarqueeInit()
{
gMarqueeQueue.qFlags = 0;
gMarqueeQueue.qHead = NIL;
gMarqueeQueue.qTail = NIL;
}
/***************************/
void MarqueeIdle( void )
{
MarqueePtr thisRec;
thisRec = (MarqueePtr) gMarqueeQueue.qHead;
for ( ; thisRec != NIL; thisRec = thisRec->fNext )
if ( thisRec->fOffset != 0 && TickCount() > thisRec->fDelayTimer)
{
thisRec->fDelayTimer = TickCount() + 1;
CopyBits( &thisRec->fBits, &thisRec->fMarqueePort->portBits,&thisRec->fFromRect, &thisRec->fToRect, srcCopy,NIL);
if (thisRec->fFromRect.left + thisRec->fOffset < 0 || thisRec->fFromRect.left + thisRec->fOffset > thisRec->fLeftMaximum)
{
thisRec->fOffset = -thisRec->fOffset;
thisRec->fDelayTimer = TickCount() + 40;
}
else
OffsetRect(&thisRec->fFromRect, thisRec->fOffset, 0);
}
}
/***************************/
void MarqueeDisplay (Str255 s, int displayWidth)
{
int sWidth, dH, lineHeight;
Point curLoc;
FontInfo fontstuff;
MarqueePtr newRec;
sWidth = StringWidth(s);
if (sWidth < displayWidth)
{
Move( -(sWidth / 2), 0);
DrawString(s);
}
else
{
newRec = (MarqueePtr) (NewPtrClear( sizeof(MarqueeRec) + 4) + 4);
GetFontInfo(&fontstuff);
lineHeight = fontstuff.ascent + fontstuff.descent + fontstuff.leading;
newRec->fBits = StringToBitMap(s, sWidth, lineHeight, fontstuff.descent);
SetRect(&newRec->fFromRect, 0, 0, displayWidth, lineHeight);
BlockMove(&newRec->fFromRect,&newRec->fToRect, sizeof(Rect));
GetPen(&curLoc);
OffsetRect(&newRec->fToRect, curLoc.h - displayWidth / 2, curLoc.v - fontstuff.ascent);
InsetRect(&newRec->fToRect, -2, -2);
FrameRect(&newRec->fToRect);
InsetRect(&newRec->fToRect, 2, 2);
newRec->fLeftMaximum = sWidth - displayWidth;
newRec->fOffset = 1;
newRec->fDelayTimer = TickCount() + 1;
GetPort(&newRec->fMarqueePort);
Enqueue( (QElemPtr) newRec, &gMarqueeQueue );
}
}